package com.ruoyi.user.utils;

import com.ruoyi.user.domain.vo.PassengerVo;

import java.util.Date;

/**
 * @author wangqingbin
 * 车型计费
 * @date 2024/10/23 10:49
 **/

public class VehicleChargeUtil {

    //地球半径
    private static final double EARTH_RADIUS = 6378137;


    public static final Date currentDateTime = new Date();

    /**
     * 新能源型费用计算
     **/
    public static Double calculatePriceForNewEnergy(PassengerVo passengerVo) {
        Double expectDistance = passengerVo.getExpectDistance();
        Double estimatedDuration = passengerVo.getEstimatedDuration();

        if (expectDistance <= 3) {
            return 10.0;
        } else if (expectDistance <= 15) {
            return 10 + (estimatedDuration * 0.3) + ((expectDistance - 3) * 2.3);
        } else {
            return 10 + (estimatedDuration * 0.3) + ((expectDistance - 3) * 2.3) + (expectDistance * 1.2);
        }
    }

    /**
     * 舒适型费用计算
     **/
    public static Double calculatePriceForComfort(PassengerVo passengerVo) {
        // ... 实现舒适型的计费逻辑
        Double expectDistance = passengerVo.getExpectDistance();
        Double estimatedDuration = passengerVo.getEstimatedDuration();

        if (expectDistance <= 3) {
            return 14.0;
        } else if (expectDistance <= 15) {
            return 14 + (estimatedDuration * 0.5) + ((expectDistance - 3) * 2.8);
        } else {
            return 10 + (estimatedDuration * 0.5) + ((expectDistance - 3) * 2.8) + (expectDistance * 1.4);
        }
    }

    /**
     * 豪华型费用计算
     **/
    public static Double calculatePriceForLuxury(PassengerVo passengerVo) {
        // ... 实现豪华型的计费逻辑
        Double expectDistance = passengerVo.getExpectDistance();
        Double estimatedDuration = passengerVo.getEstimatedDuration();

        if (expectDistance <= 3) {
            return 20.0;
        } else if (expectDistance <= 15) {
            return 20 + (estimatedDuration * 0.8) + ((expectDistance - 3) * 3.5);
        } else {
            return 20 + (estimatedDuration * 0.8) + ((expectDistance - 3) * 3.5) + (expectDistance * 1.75);
        }
    }

    /**
     * 商务型费用计算
     **/
    public static Double calculatePriceForBusiness(PassengerVo passengerVo) {
        // ... 实现商务型的计费逻辑
        Double expectDistance = passengerVo.getExpectDistance();
        Double estimatedDuration = passengerVo.getEstimatedDuration();

        if (expectDistance <= 3) {
            return 23.0;
        } else if (expectDistance <= 15) {
            return 23 + (estimatedDuration * 0.8) + ((expectDistance - 3) * 4.0);
        } else {
            return 23 + (estimatedDuration * 0.8) + ((expectDistance - 3) * 4.0) + (expectDistance * 2.0);
        }
    }


    public static Double calculateDistance(Double lat1, Double lat2, Double lon1, Double lon2) {

        //a 和 b 都是从度数转换到弧度的过程。a 代表纬度之差，b 代表经度之差。
        //lat1 和 lat2 是两个点的纬度坐标，lon1 和 lon2 是对应的经度坐标。
        //(Math.PI / 180) 是将度数转换为弧度的常数因子
        double a = (lat1 - lat2) * (Math.PI / 180); //计算纬度之差，并将其转换为弧度
        double b = (lon1 - lon2) * (Math.PI / 180); //计算经度之差，并将其转换为弧度

        // 根据经纬度差计算两点间的距离
        //这里使用了一个公式（哈弗赛恩）来计算地球上两点之间的大圆距离。该公式基于球面三角学原理，a 是两半弦长度的平方和。
        //s 是中心角的距离（以弧度表示）
        double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) +
                Math.cos(lat1 * (Math.PI / 180)) * Math.cos(lat2 * (Math.PI / 180)) * Math.pow(Math.sin(b / 2), 2)));

        // 将弧长乘以地球半径，得到距离，单位为米
        //其中 EARTH_RADIUS 是地球的平均半径（或者说是球体的半径）。对于地球来说，平均半径大约为6,371千米
        s = s * EARTH_RADIUS;

        // 返回距离，单位为公里
        return s / 1000;


    }
}
